#ifndef TRANSACTIONCOMMAND_H
#define TRANSACTIONCOMMAND_H

#include "AbstractCommand.h"
#include "Common/Core.h"
#include "Protocol/Protocol.h"

namespace Command {


/**
 * Базовый класс для команд обмена данными, которые требуют ответа
 */
class TransactionCommand : public AbstractCommand
{
public:
	TransactionCommand(MessageType requestType, MessageType responseType);

public:
	MessageType protocolMessageType() const;

protected:
	void setResponseRecieved();
	void sendData(const QByteArray& body = QByteArray());

	bool isResponseIncorrect(MessageType correctType, QDataStream& readStream);

	void processResponse(QByteArray &data);

protected:
	void execute() = 0;

	bool isWaitingForResponce();
	bool isTimedOut(quint32 msec);

private:
	// Перекроем функцию предка
	void sendData(quint8 /*msgType*/, const QByteArray& /*body*/);

	bool hasWrongResponseType(MessageType correctType, QDataStream& readStream);

private:
	quint32 _timeout;
	bool    _isWaitingResponce;
	MessageType _protocolRequestType;
	MessageType _protocolResponseType;
};

}

#endif // TRANSACTIONCOMMAND_H
